#ifndef ENUMERATIONS_H
#define	ENUMERATIONS_H
#include <GenericTypeDefs.h>

// ***************************************************************************
// CHANGE LOG
//
// ***************************************************************************

// ***************************************************************************
// ***************************************************************************
// Section: Includes
// ***************************************************************************
// ***************************************************************************

// ***************************************************************************
// ***************************************************************************
// Section: Constants & Data Types
// ***************************************************************************
// ***************************************************************************

/*! \brief Enumeration Namespace
 *
 *  Contains all the enumerations used throughout the library
 */
namespace Enums
{
	/*! \brief General Purpose Input/Output (GPIO) Namespace
	 *
	 *  Contains definitations and enumerations related to General Purpose
	 * Input/Output (GPIO)
	 */
	namespace Gpio
	{

		/*! \brief General Purpose Input/Output Port Enumeration
		 *
		 *  List of all GPIO ports available on the PIC32MX795F512L MCU
		 */
		enum class Ports
		{
			PortA, /*!< PORT A */
			PortB, /*!< PORT B */
			PortC, /*!< PORT C */
			PortD, /*!< PORT D */
			PortE, /*!< PORT E */
			PortF, /*!< PORT F */
			PortG /*!< PORT G */
		};

		/*! \brief General Purpose Input/Output Pin Enumeration
		 *
		 *  List of all GPIO pins available on each Port
		 */
		namespace Pins
		{
			const UINT16 PinCountPerPort = 16;

			/* GPIO Pin Number */
			enum class Number
			{
				Pin0 = 0, /*!< Pin 0 */
						Pin1 = 1, /*!< Pin 0 */
						Pin2 = 2, /*!< Pin 1 */
						Pin3 = 3, /*!< Pin 2 */
						Pin4 = 4, /*!< Pin 3 */
						Pin5 = 5, /*!< Pin 4 */
						Pin6 = 6, /*!< Pin 5 */
						Pin7 = 7, /*!< Pin 6 */
						Pin8 = 8, /*!< Pin 7 */
						Pin9 = 9, /*!< Pin 8 */
						Pin10 = 10, /*!< Pin 9 */
						Pin11 = 11, /*!< Pin 10 */
						Pin12 = 12, /*!< Pin 11 */
						Pin13 = 13, /*!< Pin 12 */
						Pin14 = 14, /*!< Pin 13 */
						Pin15 = 15 /*!< Pin 14 */
			};

			/*! \brief General Purpose Input/Output Pin Direction Enumeration
			 *
			 *  Pin direction
			 */
			enum class Direction
			{
				Input, /*!< Digital Input */
				Output /*!< Digital Output */
			};

			/*! \brief General Purpose Input/Output Pin Value Enumeration
			 *
			 *  Pin Value
			 */
			enum class Value
			{
				High, /*!< Logical HIGH (Vcc) */
				Low /*!< Logical LOW (Vss) */
			};

			enum class PullUpState
			{
				PullUp,
				PullDown,
				Disabled,
			};
		}
	}

	namespace Interrupts
	{
		enum class Priority
		{
			Disabled = 0x00,
			Priority1, // Lowest
			Priority2,
			Priority3,
			Priority4,
			Priority5,
			Priority6,
			Priority7 // Highest
		};

		enum class Subpriority
		{
			Subpriority0 = 0x00, // Lowest
			Subpriority1,
			Subpriority2,
			Subpriority3 // Highest
		};
	}
}
#endif	/* ENUMERATIONS_H */